const { body, param } = require("express-validator");
const { User } = require("../model");
const validate = require("../middleware/validate");
const md5 = require("../util/md5");

// 用户注册
exports.register = validate([
  // 1. 配置验证规则
  body("user.username")
    .notEmpty()
    .withMessage("用户名不能为空")
    .custom(async (username) => {
      const user = await User.findOne({ username });
      if (user) {
        return Promise.reject("用户名已被注册");
      }
    }),
  body("user.password").notEmpty().withMessage("密码不能为空"),
  body("user.email")
    .notEmpty()
    .withMessage("邮箱不能为空")
    .isEmail()
    .withMessage("邮箱格式不正确")
    .bail() // bail(): 如果之前的任何验证器失败，则停止运行验证链。如果之前的都成功，则继续后面的验证。
    .custom(async (email) => {
      const user = await User.findOne({ email });
      if (user) {
        return Promise.reject("邮箱已被注册");
      }
    }),
]);

// 用户登录
exports.login = [
  // 非空校验，不做业务逻辑校验，因为这里是并行校验，不会校验全部规则后，才执行自定义校验，因此要拆开写
  validate([
    body("user.email").notEmpty().withMessage("用户名不能为空"),
    body("user.password").notEmpty().withMessage("密码不能为空"),
  ]),
  validate([
    // 只有上面的验证通过，才会执行这个验证
    body("user.email").custom(async (email, { req }) => {
      const user = await User.findOne({ email }).select([
        "password",
        "username",
        "email",
        "bio",
        "image",
      ]);
      if (!user) {
        return Promise.reject("用户不存在");
      }
      req.user = user;
    }),
  ]),
  validate([
    body("user.password").custom(async (password, { req }) => {
      if (md5(password) !== req.user.password) {
        return Promise.reject("密码错误");
      }
    }),
  ]),
];

// 更新用户
exports.updateUser = [
  validate([param("id").notEmpty().withMessage("用户id不能为空")]),
  validate([
    param("id").custom(async (id, { req, next }) => {
      const user = req.user;
      if (id !== user._id.toString()) {
        return Promise.reject("不能修改其他用户信息");
      }
    }),
  ]),
];
